# -*- coding: utf-8 -*-
# --------------------------------------
# 利用SQLAlchemy实现数据库orm（对象关系映射），简化数据库的操作
from sqlalchemy import create_engine, Column, Integer, String, DateTime, MetaData, Table
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import declarative_base, sessionmaker, scoped_session
from urllib.parse import quote_plus  # 引入这个模块，解决数据库密码中存在@导致截断的问题，对密码进行编码。

raw_password = 'My@20241103'  # 原始密码
# 对密码进行 URL 编码
encoded_password = quote_plus(raw_password)
# 构造安全的连接字符串
connection_string = f"mysql+pymysql://root:{encoded_password}@localhost:3306/woniunote"

# 1.连接数据库，建立连接引擎
engine = create_engine(connection_string, echo=False, pool_size=20)  # echo为true会隐藏密码

# 2.定义数据模型（ORM）
# 自动映射整个数据库
Base = automap_base()
Base.prepare(autoload_with=engine)

# # 获取映射的类，得到的是表对象映射模型  最后一个users和article是表名
Users = Base.classes.users
Article = Base.classes.article

# 3.创建会话
Dbsession = sessionmaker(bind=engine)  # 绑定连接引擎，引入会话类
# dbsession=Dbsession()  #1.创建会话实例
dbsession = scoped_session(Dbsession)  # 1.创建线程安全的会话实例，多线程环境中，强烈建议使用 scoped_session。
# 上述请求结束时需要清理（Web框架通常自动处理）dbsession.remove()  # 关闭并重置当前线程的Session.flask中在app.teardown_appcontext钩子中使用这句话销毁这个会话

# 4.执行操作

if __name__ == '__main__':
    # # 1.查询第一个或全部
    # # result = dbsession.query(Article).first()
    # result = dbsession.query(Users).all()
    # print(result[0].nickname)
    # # 2.条件查询
    # result = dbsession.query(Users).filter_by(username="admin").first()
    # print(result.nickname)
    # result = dbsession.query(Users).filter(Users.nickname.like("%浪浪山%")).all()
    # print(result[0].username)
    # result = dbsession.query(Users).filter(Users.userid > 1).all()
    # print(result[0].username)
    # # 3.获取特定列
    # names = dbsession.query(Users.username).all()
    # names2 = dbsession.query(Users.userid,Users.username).all()
    # print(names2)
    # # 4.多条件查询
    # results = dbsession.query(Users).filter(
    #     Users.username != "Alice",
    #     Users.nickname.contains("浪浪山")
    # ).order_by(Users.userid.desc()).limit(10).all()
    # print(results)
    # # 5.新增插入
    # new_user = Users(username="Alice", password='234567', role="user")
    # dbsession.add(new_user)
    # dbsession.commit()  # 提交事务
    # # 6.批量插入
    # dbsession.add_all([
    #     Users(username="Bob", password='1234566', role="user"),
    #     Users(username="Charlie",  password='123456', role="user")
    # ])
    # dbsession.commit()
    # # 7. 删除和更新
    # row = dbsession.query(Users).filter_by(username="Ali").first()
    # row.password = '666666'
    # dbsession.commit()
    # 删除
    dbsession.query(Users).filter_by(username="Alice").delete()
    dbsession.commit()